/*单例模式的特点：
  全局访问点：通过 getInstance 或构造函数，外部代码可以获得单一实例。
  唯一性：无论创建多少次，单例模式都保证只有一个实例存在。
* 使用场景：
  配置管理：比如数据库连接池，日志管理器等。
  缓存：确保整个应用使用相同的缓存实例。
* */

// class Singleton {
//   constructor() {
//     if(Singleton.instance){
//       return Singleton.instance
//     }
//     Singleton.instance = this
//   }
// }

class Singleton {
  static getInstance() {
    if (!Singleton.instance) {
      Singleton.instance = new Singleton()
    }
    return Singleton.instance
  }
}

const instance1 = Singleton.getInstance()
const instance2 = Singleton.getInstance()
console.log(instance1 === instance2)


// const instance1 = new Singleton()
// const instance2 = new Singleton()
// console.log(instance1 === instance2)


// const Singleton = (function () {
//       let instance = null
//       function createInstance() {
//         return {
//           name: 'instance',
//         }
//       }
//       return {
//         getInstance() {
//           if (!instance) {
//             instance = createInstance();
//           }
//           return instance
//         }
//       }
//     }
// )()
// const instance1 = Singleton.getInstance()
// const instance2 = Singleton.getInstance()
// console.log(instance1 === instance2)


//实现Storage，使得该对象为单例，基于 localStorage 进行封装。实现方法 setItem(key,value) 和 getItem(key)。


// class Storage {
//   constructor() {
//     if(Storage.instance){
//       return Storage.instance
//     }
//     Storage.instance = this
//   }
//
//   getItem(key){
//     return window.localStorage.getItem(key)
//   }
//   setItem(key, value){
//    return window.localStorage.setItem(key, value)
//   }
// }
//
// const storage1 = new Storage()
// const storage2 = new Storage()
//
// storage1.setItem('name', '李雷')
// // 李雷
// storage1.getItem('name')
// // 也是李雷
// storage2.getItem('name')
//
// // 返回true
// console.log(storage1 === storage2)
